﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace AudiPyme.DAL
{
    public class EmpresaInformeFactory
    {
        //Estructura para recoger con formato la fecha de un Informe
        public struct DateInforme
        {
            String fechaActual;

            public DateInforme(String Fecha)
            {
                fechaActual = Fecha;
            }

            public String FechaActual
            {
                get { return fechaActual; }
                set { fechaActual = value; }
            }

        }

        //Inserta los valores de una empresa en la tabla EmpresaInforme
        public static bool InsertaEmpresaInforme(int IdEmpresa, int IdInforme)
        {
            //Valor de la ejecucion si todo va bien
            bool ok = true;
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<Empresas> EmpresaQuery = from Emp in agenteBD.EmpresasEstablecer
                                                where Emp.IdEmpresa == IdEmpresa
                                                select Emp;
            if (EmpresaQuery.Count() == 0)
            {
                //No se recogio la empresa se devuelve un valor de error
                ok = false;
                return ok;
            }
            else
            {
                Empresas Empresa = EmpresaQuery.First();
                //Cremaos el elemento
                EmpresaInforme NuevaEmpresaInf = new EmpresaInforme();
                NuevaEmpresaInf.IdInforme = IdInforme;
                NuevaEmpresaInf.IdEmpresa = IdEmpresa;
                NuevaEmpresaInf.FacturacionInf = Empresa.Facturacion.Value;
                NuevaEmpresaInf.MadurezActualInf = Empresa.MadurezActual.Value;
                NuevaEmpresaInf.MadurezDeseadaInf = Empresa.MadurezDeseada.Value;
                NuevaEmpresaInf.PesoSectorInf = Empresa.PesoSector.Value;
                NuevaEmpresaInf.PesoNegocioInf = Empresa.PesoNegocio.Value;
                NuevaEmpresaInf.PesoTICInf = Empresa.PesoTIC.Value;
                NuevaEmpresaInf.NumEmpleadosInf = Empresa.NumEmpleados;
                agenteBD.AddToEmpresaInformeEstablecer(NuevaEmpresaInf);
                agenteBD.SaveChanges();
                return ok;
            }
        }

        //Método que devuelve el Tipo de Empresa a la que pertenece un Informe
        public static String TipoEmpresaEmpresaInforme(int IdInforme)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<int> IdTipoEmpresa = from EmpInf in agenteBD.EmpresaInformeEstablecer
                                            join Emp in agenteBD.EmpresasEstablecer on EmpInf.IdEmpresa equals Emp.IdEmpresa
                                            where EmpInf.IdInforme == IdInforme
                                            select Emp.IdTipoEmpresa;
            if (IdTipoEmpresa.Count() == 0)
            {
                return "";
            }
            else
            {
                int IdTipoEmpresaEncontrado = IdTipoEmpresa.First();
                IQueryable<String> NombreTipoEmpresa = from e in agenteBD.TipoEmpresaEstablecer
                                                       where e.IdTipoEmpresa == IdTipoEmpresaEncontrado && e.NombreTipoEmpresa != null
                                                       select e.NombreTipoEmpresa;
                if (NombreTipoEmpresa.Count() == 0)
                {
                    return "";
                }
                else
                {
                    return NombreTipoEmpresa.First();
                }
            }
        }

        //Método que devuelve el Sector al que pertenece la empresa de un informe
        public static String SectorEmpresaInforme(int IdInforme)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            //Recogemos su Id
            IQueryable<int> IdSector = from EmpInf in agenteBD.EmpresaInformeEstablecer
                                       join Emp in agenteBD.EmpresasEstablecer on EmpInf.IdEmpresa equals Emp.IdEmpresa
                                       where EmpInf.IdInforme == IdInforme && Emp.Nombre != null
                                       select Emp.IdSector;
            if (IdSector.Count() == 0)
            {
                return "";
            }
            //Sacamos el Nombre del Sector a través del Id
            else
            {
                int IdSectorEncontrado = IdSector.First();
                IQueryable<String> NombreSector = from s in agenteBD.SectoresEstablecer
                                                  where s.IdSector == IdSectorEncontrado && s.NombreSector != null
                                                  select s.NombreSector;
                if (IdSector.Count() == 0)
                {
                    return "";
                }
                else
                {
                    return NombreSector.First();
                }
            }
        }

        //Nombre de la Madurez Actual de una empresa en un informe dado
        public static String NMadurezActualInforme(int IdInforme)
        {
            String NMadurezActInf = "";
            int IdMadActualInf = EmpresasFactory.MadurezActualEmpresaInforme(IdInforme);
            switch (IdMadActualInf)
            {
                case 1:
                    NMadurezActInf = "Baja";
                    break;
                case 2:
                    NMadurezActInf = "Media";
                    break;
                case 3:
                    NMadurezActInf = "Alta";
                    break;
                default:
                    NMadurezActInf = "No se ha establecido";
                    break;
            }
            return NMadurezActInf;
        }

        //Método que devuelve el id de madurez para un informe asociado a una empresa
        public static int MadurezDeseadaInforme(int IdInforme)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<int> MadDesInf = from EmpInf in agenteBD.EmpresaInformeEstablecer
                                        where EmpInf.IdInforme == IdInforme
                                        select EmpInf.MadurezDeseadaInf;
            if (MadDesInf.Count() == 0)
            {
                return 0;
            }
            else
            {
                return MadDesInf.First();
            }
        }

        //Devuelve el Nombre del Nivel de Madurez Deseada para un Informe asociado a una empresa
        public static String NMadurezDeseadaInforme(int IdInforme)
        {
            String NMadurezDes = "";
            int IdMadDes = EmpresaInformeFactory.MadurezDeseadaInforme(IdInforme);
            switch (IdMadDes)
            {
                case 1:
                    NMadurezDes = "Baja";
                    break;
                case 2:
                    NMadurezDes = "Media";
                    break;
                case 3:
                    NMadurezDes = "Alta";
                    break;
                default:
                    NMadurezDes = "No se ha establecido";
                    break;
            }
            return NMadurezDes;
        }

        //Devuelve el identificador de tipo de empresa de un informe asociado a una empresa
        public static int IdTipoEmpresaInforme(int IdInforme)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<int> IdTipoEmpresa = from EmpInf in agenteBD.EmpresaInformeEstablecer
                                            join Emp in agenteBD.EmpresasEstablecer on EmpInf.IdEmpresa equals Emp.IdEmpresa
                                            where EmpInf.IdInforme == IdInforme
                                            select Emp.IdTipoEmpresa;
            if (IdTipoEmpresa.Count() == 0)
            {
                return 0;
            }
            else
            {
                return IdTipoEmpresa.First();
            }
        }

        //Método que recoge el IdSector de la empresa asociada al informe
        public static int IdSectorEmpresaInforme(int IdInforme)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<int> IdSector = from EmpInf in agenteBD.EmpresaInformeEstablecer
                                       join Emp in agenteBD.EmpresasEstablecer on EmpInf.IdEmpresa equals Emp.IdEmpresa
                                       where EmpInf.IdInforme == IdInforme
                                       select Emp.IdSector;
            if (IdSector.Count() == 0)
            {
                return 0;
            }
            else
            {
                return IdSector.First();
            }
        }

        //Método que devuelve toda la información de una EmpresaInforme según el IdInforme
        public static EmpresaInforme EmpresaDeInforme(int IdInforme)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<EmpresaInforme> EmpInfQuery = from e in agenteBD.EmpresaInformeEstablecer
                                                     where e.IdInforme == IdInforme && e.IdInforme != null
                                                     select e;
            if (EmpInfQuery.Count() == 0)
            {
                return new EmpresaInforme();
            }
            else
            {
                EmpresaInforme EmpresaDevolver = new EmpresaInforme();
                EmpresaDevolver = EmpInfQuery.First();
                return EmpresaDevolver;
            }
        }

        //Método que indica si una Empresa tiene informes en la Base de Datos
        public static bool HayInformesEmpresa(int EmpresaUsuario)
        {
            bool tieneInformes = false;
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<EmpresaInforme> NInfEmp = from EmpInf in agenteBD.EmpresaInformeEstablecer
                                                 where EmpInf.IdEmpresa == EmpresaUsuario
                                                 select EmpInf;
            if (NInfEmp.Count() != 0)
            {
                tieneInformes = true;
            }
            return tieneInformes;
        }

        //Método que elimina de forma permanente, todos los pares empresas-informe asociados a una empresa
        //y devuelve los Ids de Informes asociados a una empresa
        internal static List<int> EliminaTotalEmpresaInforme(int IdEmpresa)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            List<int> LIdsInformes = new List<int>();
            IQueryable<EmpresaInforme> EmpresaInformeEliminarQuery = from EmpInf in agenteBD.EmpresaInformeEstablecer
                                                                     where EmpInf.IdEmpresa == IdEmpresa
                                                                     select EmpInf;
            if (EmpresaInformeEliminarQuery.Count() != 0)
            {
                //Por cada tupla empresa-informe recogida
                foreach (EmpresaInforme EmpresaInforme in EmpresaInformeEliminarQuery)
                {
                    //Recogemos el Id de Informe y se añade a la lista
                    int IdInforme = EmpresaInforme.IdInforme;
                    LIdsInformes.Add(IdInforme);
                    //Se elimina la tupla
                    agenteBD.EmpresaInformeEstablecer.DeleteObject(EmpresaInforme);
                }
                agenteBD.SaveChanges();
            }
            return LIdsInformes;
        }

        //Método que elimina de forma permanente, todos los elementos empresas-informe asociados a un informe
        internal static void EliminaEmpresaInforme(int IdInforme)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<EmpresaInforme> EmpresaInformeEliminarQuery = from EmpInf in agenteBD.EmpresaInformeEstablecer
                                                                     where EmpInf.IdInforme == IdInforme
                                                                     select EmpInf;
            if (EmpresaInformeEliminarQuery.Count() != 0)
            {
                foreach (EmpresaInforme EmpresaInforme in EmpresaInformeEliminarQuery)
                {
                    agenteBD.EmpresaInformeEstablecer.DeleteObject(EmpresaInforme);
                }
                agenteBD.SaveChanges();
            }
        }

        //Recoge el número de informes asociados a una empresa
        public static int NumeroInformesEmpresa(int IdEmpresa)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            int nInform = (from EmpInf in agenteBD.EmpresaInformeEstablecer
                           where EmpInf.IdEmpresa == IdEmpresa
                           select EmpInf).Count();
            return nInform;
        }

        //Elimina los elementos empresainforme asociados a una lista de informes
        internal static void EliminaEmpresaInformes(List<int> LInformes)
        {
            ModeloContainer agenteBD = new ModeloContainer();
            IQueryable<EmpresaInforme> EmpresaInformeEliminarQuery = from EmpInf in agenteBD.EmpresaInformeEstablecer
                                                                     where LInformes.Contains(EmpInf.IdInforme)
                                                                     select EmpInf;
            if (EmpresaInformeEliminarQuery.Count() != 0)
            {
                foreach (EmpresaInforme EmpresaInforme in EmpresaInformeEliminarQuery)
                {
                    agenteBD.EmpresaInformeEstablecer.DeleteObject(EmpresaInforme);
                }
                agenteBD.SaveChanges();
            }
        }
    }
}
